package com.cougil.uoc.seghismed.action;

import com.cougil.uoc.seghismed.business.CoreClientService;
import com.cougil.uoc.seghismed.model.comunicacions.Resposta;
import com.cougil.uoc.seghismed.model.comunicacions.enums.Resultat;
import com.cougil.uoc.seghismed.model.struts.Mode;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

/**
 * Acció per defecte pels aplicatius Seghismed
 *
 * @author Ignacio Cougil Jares
 *
 */
public abstract class SeghismedAction extends ActionSupport {

	private static final long serialVersionUID = 7564202207434710998L;
	protected CoreClientService clientService;
	private Mode mode;
	private String name;

	/**
	 * Métode a implementar per les classes filla encarregat de retornar la seva classe del servei apropiada
	 */
	protected abstract CoreClientService getClientService();

	/**
	 * Retorna el mode en el que es troba l'acció
	 *
	 * @return mode assignat
	 */
	public Mode getMode() {
		return this.mode;
	}

	/**
	 * Retorna el títol de l'acció
	 *
	 * @return cadena amb el títol corresponent
	 */
	public String getTitle() {
		String title = null, key = null;
		// si hem associat un nom, llavors no emprem el nom de l'action
		if (this.name != null) {
			key = this.name;
		} else {
			key = this.getClass().getSimpleName().toLowerCase();
			key = key.substring(0, key.length() - "action".length());
		}
		Mode mode = this.getMode();
		if (mode == null) {
			mode = Mode.CREATE;
		}
		key = key + "." + mode.getNom() + "." + "title";

		// obtenim finalment el valor del fitxer de propietats
		title = this.getText(key);
		if (!title.equals(key)) {
			title = " - " + title;
		}
		return title;
	}

	/**
	 * Crida al servei per abandonar el sistema
	 *
	 * @return la cadena que representa l'acció de sortida
	 */
	public String logout() {
		Resposta r = this.clientService.sortir();
		String result = Action.SUCCESS;
		if (!Resultat.OK.equals(r.getResultat())) {
			result = Action.ERROR;
			this.addActionError(r.getDescripcio());
		}
		return result;
	}

	/**
	 * @param Estableix clientService com a valor de la propietat clientService
	 */
	public void setClientService(CoreClientService clientService) {
		this.clientService = clientService;
	}

	protected void setMode(Mode mode) {
		this.setMode(mode, null);
	}

	protected void setMode(Mode mode, String name) {
		this.mode = mode;
		this.name = name;
	}


}
